//
//  Problem1338.swift
//  TestProject
//
//  Created by 武侠 on 2021/5/21.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 1338. 数组大小减半
 给你一个整数数组 arr。你可以从中选出一个整数集合，并删除这些整数在数组中的每次出现。
 返回 至少 能删除数组中的一半整数的整数集合的最小大小。

 示例 1：
     输入：arr = [3,3,3,3,5,5,5,2,2,7]
     输出：2
     解释：选择 {3,7} 使得结果数组为 [5,5,5,2,2]、长度为 5（原数组长度的一半）。
     大小为 2 的可行集合有 {3,5},{3,2},{5,2}。
     选择 {2,7} 是不可行的，它的结果数组为 [3,3,3,3,5,5,5]，新数组长度大于原数组的二分之一。
 示例 2：
     输入：arr = [7,7,7,7,7,7]
     输出：1
     解释：我们只能选择集合 {7}，结果数组为空。
 示例 3：
     输入：arr = [1,9]
     输出：1
 示例 4：
     输入：arr = [1000,1000,3,7]
     输出：1
 示例 5：
     输入：arr = [1,2,3,4,5,6,7,8,9,10]
     输出：5
 提示：
     1 <= arr.length <= 10^5
     arr.length 为偶数
     1 <= arr[i] <= 10^5
 */
@objcMembers class Problem1338: NSObject {
    func solution() {
        print(minSetSize([3,3,3,3,5,5,5,2,2,7]))
        print(minSetSize([7,7,7,7,7,7]))
        print(minSetSize([1,9]))
        print(minSetSize([1000,1000,3,7]))
        print(minSetSize([1,2,3,4,5,6,7,8,9,10]))
    }
    
    /*
     Map
     1: 使用map记录每个数的个数
     2: 排序：根据个数的大小进行降序排序
     3: 遍历排序后的数组，计算和sum，如果sum>n/2,找到了
     */
    func minSetSize(_ arr: [Int]) -> Int {
        var map:[Int:Int] = [:]
        for n in arr {
            map[n, default: 0] += 1
        }
        
        let list = map.values.sorted { f, s in
            return f > s
        }
        
        var num = 0
        var sum = 0
        for n in list {
            sum += n
            num += 1
            
            if sum >= arr.count/2 {
               break
            }
        }
        return num
    }
}
